Web 安全 CSRF 原理与实践
1. 什么是CSRF
CSRF (Cross Site Request Forgery,跨站请求伪造) 是一种常见的Web攻击方式。攻击者会利用用户在已认证的Web应用程序的已登陆状态,诱导用户在另一个页面上触发恶意请求,而这些请求会被服务器误认为是用户本人发起的合法行为。
为了防止此类攻击,Web应用通常需要在身份认证之外,加入额外的请求合法性检验,最常见见的合法性校验方式为CSRF Token。
2. 如何防范 CSRF 攻击:CSRF Token
其工作流程可以概括为以下四步:
- 服务端生成唯一token。该token用于标识当前用户会话,在前后端交互时由后端通过响应头或响应体向前端传递。
- 客户端使用token与后端交互。客户端获取到token后,在向后端发送请求时需要携带该token,例如将Token放入请求头,以表明该请求确实来自可信页面。
- 服务端校验token。服务端在接收请求后,先对token进行验证。如果Token缺失、不匹配或已过期,则会拒绝请求。
- 服务端重新生成token,避免token重用(可选)。服务端在响应包含token的合法请求时,应返回一个新的token,从而避免token重放攻击。
该方法相当于在认证用户信息的基础上,利用csrf-token标记合理的用户请求。由于csrf-token获取条件苛刻,并且不会重复使用,极大提高了csrf攻击的难度,可以有效防范csrf攻击。
3. 前端实践:如何管理CSRF Token
为了使Token使用更加自动化,通常会在前端封装统一的拦截器逻辑:
- 在响应拦截器中拦截最新Token。
- 从响应头中提取
x-csrf-token。 - 根据服务或域名进行缓存。
- 供下一次请求使用。
- 在请求拦截器中自动携带Token
- 在发送请求前读取目标服务对应的CSRF Token信息
- 为目标服务添加
x-csrf-token请求头
- CSRF Token失效时自动重试
- 当服务端返回
CSRF Token invalid错误时,触发刷新 Token 的请求,并使用新的 Token 重试原请求。 - 用户不会感知重试流程。
通过拦截器将逻辑集中管理,可以避免在业务代码中散落重复逻辑,使 Token 使用更加安全、稳定、统一。